/* Types.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 07/22/2014
 *  Last Modified   : 07/22/2014
 * 
 *      This header is pulled into fucking everything. It doesn't cost much to
 *  avoid pulling in <stdint.h> if we don't need to.
 * 
 */

//#define ymp_use_stdint

#pragma once
#ifndef ymp_Types_H
#define ymp_Types_H
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#ifdef ymp_use_stdint
#include <stdint.h>
#endif
namespace ymp{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Fixed Sizes
#ifdef ymp_use_stdint
using u16_t = uint16_t;
using u32_t = uint32_t;
using s32_t = int32_t;
using u64_t = uint64_t;
using s64_t = int64_t;
#else
using u16_t = unsigned short;
using u32_t = unsigned int;
using s32_t = int;
#if _WIN32
using u64_t = unsigned long long;
using s64_t = long long;
#else
using u64_t = unsigned long;
using s64_t = long;
#endif
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Logarithmic Size
using ukL_t = u32_t;
using skL_t = s32_t;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Pointer Sizes (should match "size_t")
#if _M_X64 || __x86_64
#define YMP_PTR_MAG     6
const ukL_t PTR_BITS = 64;
using upL_t = u64_t;
using spL_t = s64_t;
#else
#define YMP_PTR_MAG     5
const ukL_t PTR_BITS = 32;
using upL_t = u32_t;
using spL_t = s32_t;
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Far Memory (must be at least as large as the "Pointer Sizes" above)
using ufL_t = u64_t;
using sfL_t = s64_t;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Integer Index Size (must be at least as large as the "Far Memory Sizes" above)
#define YMP_INDEX_MAG   6
const ukL_t INDEX_BITS = 64;
using uiL_t = u64_t;
using siL_t = s64_t;
//const siL_t MAX_SIL = 0x7fffffffffffffffLL;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Float Index Size
using fiL_t = double;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
#endif
